\begin{tikzpicture}

	\definecolor{corecolor}     {rgb}{0.7,0.8,0.9}
	\definecolor{balancercolor} {rgb}{1,0.8,0.7}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1]

	\tikzstyle{subsystem} = [minimum width=6ex, minimum height=3ex, align=center,
	                         draw=black!80, fill=white, fill opacity=0.6]

	%
	% Core
	%
	\node[treenode, bottom color=corecolor, minimum width=32ex, minimum height=6ex] (core) {};
	\path (core.east) node[left=1ex] {Core};

	\path (core.west)    node[right=1ex, subsystem] (corerom) {ROM};
	\path (corerom.east) node[right=1ex, subsystem] (corepd)  {PD};
	\path (corepd.east)  node[right=1ex, subsystem] (corecpu) {CPU};

	%
	% CPU balancer
	%
	\path (core.north east)+(0,6ex)
		node[treenode, bottom color=balancercolor, minimum width=18ex,
		      minimum height=6ex, anchor=south east] (balancer) {};

	\path (balancer.east) node[left=1ex, align=right] {CPU\\Balancer};

	\path (corecpu |- balancer) node[subsystem] (balancercpu) {CPU};

	\path (balancer.east)+(5ex,0)
		node[umlinfo, anchor=west] (policy) { Dynamic \\ Policy };

	\tikzstyle{infoflow} = [opacity=0.3,
	                        decoration={markings,
	                        mark=between positions 0.15 and 0.95 step 1ex with {\arrow{latex}}},
	                        postaction={decorate}]

	\path[infoflow] (policy.west) -- (balancer.east);

	%
	% Workload
	%
	\path (balancer.north east)+(0,6ex)
		node[treenode, minimum width=32ex, minimum height=6ex, anchor=south east] (target) {};
	\path (target.center) node[align=center] {CPU-balanced\\Workload};

	\coordinate (componentrom) at (corerom |- target.south);
	\coordinate (componentpd)  at (corepd  |- target.south);
	\coordinate (componentcpu) at (corecpu |- target.south);

	\path (corerom) -- coordinate (midrom) (componentrom);
	\path (corepd)  -- coordinate (midpd)  (componentpd);
	\path (corecpu) -- coordinate (midcpu) (componentcpu);

	\draw[arrow] (componentrom) -- (corerom);
	\draw[arrow] (componentpd)  -- (corepd);

	\draw[arrow] (componentcpu) -- (balancercpu);
	\draw[arrow, densely dashed] (balancercpu) -- (corecpu);

\end{tikzpicture}
